/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package fem;
import fem.exceptions.OutOfMasterElementException;
/**
 *
 * @author freeze
 */
public class LocalShapeFunction {
    int order; //umawiamy się, ze order 0 to funkcja lokalna wierzcholkowa malejąca
                // order 1 to wierzcholkowa rosnaca (porzadek wg ksiazki prof.Demkowicza).
               //Dalej order odpowiada stopniom wielomianow
    Element definedOn;
    GlobalShapeFunction parent;
    public LocalShapeFunction(int order, Element definedOn, GlobalShapeFunction parent) // czy parent potrzebny od razu
    {
        this.order=order;
        this.definedOn=definedOn;
        this.parent=parent;
    }
    public static double getValue(double x, int order) throws OutOfMasterElementException
            // static, bo jako, ze wolno nam 
                                                //pobierac wartosc  tylko na elemencie wzorcowym, nie pasuje
                                                // zrobienie z tego metody niestatycznej
    {     
        // rekurencyjnie jest wolniej nieco, no ale to i tak ma byc tylko
        // taki modelowy MES
        if( x < 0 || x > 1)
            throw new OutOfMasterElementException();
        switch(order)
        {
            case 0:        
                return 1-x;
            case 1:
               return x;
            case 2:
                return (1-x)*x;
            default:
                return getValue(x, order-1) * (2*x-1);
        }
        
    }
    public static double getDerivativeValue(double x, int order) throws OutOfMasterElementException
    {
        if( x < 0 || x > 1)
            throw new OutOfMasterElementException();
        switch(order)
        {
            case 0:
                return -1;
            case 1:
                return 1;
            case 2:
                return 2*x-1;
            default:    // mam nadzieje, ze twierdzenie o pochodnej iloczynu tutaj obowiązuje
                return getDerivativeValue(x,order-1)*(2*x-1) + getValue(x, order)*2;
        }
    }
}
